package cn.tedu.controller;

import cn.tedu.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * 处理与用户相关的业务操作
 *
 * Spring MVC框架要求，只有被注解@Controller标注的类才会被识别
 * 且对应的方法上有@RequestMapping的注解才会处理某个来自前端页面的请求。
 */
@Controller
public class UserController {

    private static File userDir;//该目录用于保存所有注册用户文件(一堆的.obj文件)

    @RequestMapping("/regUser")//括号中的参数值应当与特定的请求一致(比如和某页面的form表单action一致)
    public void reg(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("开始处理用户的注册操作！！！！！！！！！！！！！！！");
        //对应reg.html页面表单中<input name="username" type="text">
        String username = request.getParameter("username");

        String password = request.getParameter("password");
        String nickname = request.getParameter("nickname");
        String age = request.getParameter("age");
        System.out.println(username+","+password+","+nickname+","+age);

        //对数据进行必要的验证工作
        if(username.isEmpty()||password.isEmpty()||nickname.isEmpty()||age.isEmpty()||
                !age.matches("[0-9]+")){
            //如果如何上述情况，则直接响应给用户一个注册失败提示页面，告知信息输入有误。
            try {
                response.sendRedirect("/reg_info_error.html");
                return;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //处理注册
        //将年龄转换为int值
        int age_ = Integer.parseInt(age);
        User user = new User(username,password,nickname,age_);

        //参数1:当前File表示的文件所在的目录  参数2:当前文件的名字
        File userFile = new File(userDir,username+".obj");
        if(userFile.exists()){//文件已经存在说明该用户已经存在了!
            try {
                response.sendRedirect("/have_user.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }

        try (
                FileOutputStream fos = new FileOutputStream(userFile);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
        ){
            oos.writeObject(user);
            //响应注册成功页面给浏览器
            response.sendRedirect("/reg_success.html");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("/loginUser")
    public void login(HttpServletRequest request,HttpServletResponse response){
        System.out.println("开始处理登录！！！！！！！！！！！！！！！");
        /*
            1:从request中将表单中用户输入的用户名和密码获取
            2:必要的验证工作(两项内容不能为空)
              若有空的情况，直接响应页面:login_info_error.html
              提示:登录信息输入有误，请重新登录
            3:根据该用户的用户名读取对应的obj文件
              进行反序列化，并将得到的User对象和该登录用户输入的用户名和密码比对
              若比对成功则响应登录成功页面:login_success.html
              提示:登录成功，欢迎回来!
              若比对失败则响应登录失败页面:login_fail.html
              提示:用户名或密码错误，请重新登录。
         */
        //获取用户的登录信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if(username.isEmpty()||password.isEmpty()){
            try {
                response.sendRedirect("/login_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }

        File userFile = new File(userDir,username+".obj");
        if(userFile.exists()){//文件存在则说明用户名输入正确
            //反序列化该文件中之前的注册信息
            try (
                    FileInputStream fis = new FileInputStream(userFile);
                    ObjectInputStream ois = new ObjectInputStream(fis);
            ){
                User user = (User)ois.readObject();
                if(user.getPassword().equals(password)){//密码正确
                    //登录成功
                    response.sendRedirect("/login_success.html");
                    return;
                }
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }


        //登录失败
        try {
            response.sendRedirect("/login_fail.html");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}
